/******************************************************************************* * Copyright (c) 2000, 2011 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jdt.internal.ui.refactoring; import org.eclipse.swt.SWT; import org.eclipse.swt.events.ModifyEvent; import org.eclipse.swt.events.ModifyListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Text; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jface.dialogs.StatusDialog; import org.eclipse.ltk.core.refactoring.RefactoringStatus; import org.eclipse.jdt.core.JavaConventions; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.corext.refactoring.Checks; import org.eclipse.jdt.internal.corext.refactoring.ParameterInfo; import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; import org.eclipse.jdt.internal.corext.refactoring.StubTypeContext; import org.eclipse.jdt.internal.corext.refactoring.TypeContextChecker; import org.eclipse.jdt.internal.corext.refactoring.structure.ChangeSignatureProcessor; import org.eclipse.jdt.internal.corext.util.JavaConventionsUtil; import org.eclipse.jdt.internal.corext.util.Messages; import org.eclipse.jdt.internal.ui.JavaPlugin; import org.eclipse.jdt.internal.ui.dialogs.TextFieldNavigationHandler; import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper; import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor; import org.eclipse.jdt.internal.ui.viewsupport.BasicElementLabels; public class ParameterEditDialog extends StatusDialog { private final ParameterInfo fParameter; private final boolean fEditType; private final boolean fEditDefault; private final StubTypeContext fContext; private Text fType; private Text fName; private Text fDefaultValue; /** * @param parentShell * @param parameter * @param canEditType * @param canEditDefault * @param context the <code>IPackageFragment</code> for type ContentAssist. * Can be <code>null</code> if <code>canEditType</code> is <code>false</code>. */ public ParameterEditDialog(Shell parentShell, ParameterInfo parameter, boolean canEditType, boolean canEditDefault, StubTypeContext context) { super(parentShell); fParameter= parameter; fEditType= canEditType; fEditDefault= canEditDefault; fContext= context; } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); newShell.setText(RefactoringMessages.ParameterEditDialog_title); } @Override protected Control createDialogArea(Composite parent) { Composite result= (Composite)super.createDialogArea(parent); GridLayout layout= (GridLayout)result.getLayout(); layout.numColumns= 2; Label label; GridData gd; label= new Label(result, SWT.NONE); String newName = fParameter.getNewName(); if (newName.length() == 0) label.setText(RefactoringMessages.ParameterEditDialog_message_new); else label.setText(Messages.format(RefactoringMessages.ParameterEditDialog_message, BasicElementLabels.getJavaElementName(newName))); gd= new GridData(GridData.FILL_HORIZONTAL); gd.horizontalSpan= 2; label.setLayoutData(gd); if (fEditType) { label= new Label(result, SWT.NONE); label.setText(RefactoringMessages.ParameterEditDialog_type); fType= new Text(result, SWT.BORDER); gd= new GridData(GridData.FILL_HORIZONTAL); fType.setLayoutData(gd); fType.setText(fParameter.getNewTypeName()); fType.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { validate((Text)e.widget); } }); TextFieldNavigationHandler.install(fType); JavaTypeCompletionProcessor processor= new JavaTypeCompletionProcessor(true, false); processor.setCompletionContext(fContext.getCuHandle(), fContext.getBeforeString(), fContext.getAfterString()); ControlContentAssistHelper.createTextContentAssistant(fType, processor); } label= new Label(result, SWT.NONE); fName= new Text(result, SWT.BORDER); initializeDialogUnits(fName); label.setText(RefactoringMessages.ParameterEditDialog_name); gd= new GridData(GridData.FILL_HORIZONTAL); gd.widthHint= convertWidthInCharsToPixels(45); fName.setLayoutData(gd); fName.setText(newName); fName.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { validate((Text)e.widget); } }); TextFieldNavigationHandler.install(fName); if (fEditDefault && fParameter.isAdded()) { label= new Label(result, SWT.NONE); label.setText(RefactoringMessages.ParameterEditDialog_defaultValue); fDefaultValue= new Text(result, SWT.BORDER); gd= new GridData(GridData.FILL_HORIZONTAL); fDefaultValue.setLayoutData(gd); fDefaultValue.setText(fParameter.getDefaultValue()); fDefaultValue.addModifyListener( new ModifyListener() { public void modifyText(ModifyEvent e) { validate((Text)e.widget); } }); TextFieldNavigationHandler.install(fDefaultValue); } applyDialogFont(result); return result; } @Override protected void okPressed() { if (fType != null) { fParameter.setNewTypeName(fType.getText()); } fParameter.setNewName(fName.getText()); if (fDefaultValue != null) { fParameter.setDefaultValue(fDefaultValue.getText()); } super.okPressed(); } private void validate(Text first) { IStatus[] result= new IStatus[3]; if (first == fType) { result[0]= validateType(); result[1]= validateName(); result[2]= validateDefaultValue(); } else if (first == fName) { result[0]= validateName(); result[1]= validateType(); result[2]= validateDefaultValue(); } else { result[0]= validateDefaultValue(); result[1]= validateName(); result[2]= validateType(); } for (int i= 0; i < result.length; i++) { IStatus status= result[i]; if (status != null && !status.isOK()) { updateStatus(status); return; } } updateStatus(Status.OK_STATUS); } private IStatus validateType() { if (fType == null) return null; String type= fType.getText(); RefactoringStatus status= TypeContextChecker.checkParameterTypeSyntax(type, fContext.getCuHandle().getJavaProject()); if (status == null || status.isOK()) return Status.OK_STATUS; if (status.hasError()) return createErrorStatus(status.getEntryWithHighestSeverity().getMessage()); else return createWarningStatus(status.getEntryWithHighestSeverity().getMessage()); } private IStatus validateName() { if (fName == null) return null; String text= fName.getText(); if (text.length() == 0) return createErrorStatus(RefactoringMessages.ParameterEditDialog_name_error); IStatus status= fContext != null ? JavaConventionsUtil.validateFieldName(text, fContext.getCuHandle().getJavaProject()) : JavaConventions.validateFieldName(text, JavaCore.VERSION_1_3, JavaCore.VERSION_1_3); if (status.matches(IStatus.ERROR)) return status; if (! Checks.startsWithLowerCase(text)) return createWarningStatus(RefactoringCoreMessages.ExtractTempRefactoring_convention); return Status.OK_STATUS; } private IStatus validateDefaultValue() { if (fDefaultValue == null) return null; String defaultValue= fDefaultValue.getText(); if (defaultValue.length() == 0) return createErrorStatus(RefactoringMessages.ParameterEditDialog_defaultValue_error); if (ChangeSignatureProcessor.isValidExpression(defaultValue)) return Status.OK_STATUS; String msg= Messages.format(RefactoringMessages.ParameterEditDialog_defaultValue_invalid, new String[]{defaultValue}); return createErrorStatus(msg); } private Status createWarningStatus(String message) { return new Status(IStatus.WARNING, JavaPlugin.getPluginId(), IStatus.WARNING, message, null); } private Status createErrorStatus(String message) { return new Status(IStatus.ERROR, JavaPlugin.getPluginId(), IStatus.ERROR, message, null); } }